package com.tarena.lbs.common.exception;

import com.tarena.lbs.common.response.JsonResult;
import com.tarena.lbs.common.response.StatusCode;
import lombok.extern.slf4j.Slf4j;

import java.util.function.Supplier;

/**
 * 异常处理工具类
 */
@Slf4j
public class ExceptionHandlerUtil {

    /**
     * 处理业务方法，统一捕获异常并返回 JsonResult
     * @param supplier 业务逻辑
     * @param successMessage 成功消息
     * @return JsonResult
     */
    public static <T> JsonResult<T> handleBusiness(Supplier<T> supplier, String successMessage) {
        try {
            T result = supplier.get();
            return JsonResult.ok(result, successMessage);
        } catch (ServiceException e) {
            log.warn("业务异常: code={}, message={}", e.getCode(), e.getMessage());
            return JsonResult.error(e.getCode(), e.getMessage());
        } catch (Exception e) {
            log.error("系统异常: ", e);
            return JsonResult.error(StatusCode.UNKNOWN_ERROR.getCode(), "系统异常，请联系管理员");
        }
    }

    /**
     * 处理业务方法，使用默认成功消息
     */
    public static <T> JsonResult<T> handleBusiness(Supplier<T> supplier) {
        return handleBusiness(supplier, "操作成功");
    }

    /**
     * 处理无返回值业务方法
     */
    public static JsonResult<Void> handleBusiness(Runnable businessLogic, String successMessage) {
        try {
            businessLogic.run();
            return JsonResult.ok(null, successMessage);
        } catch (ServiceException e) {
            log.warn("业务异常: code={}, message={}", e.getCode(), e.getMessage());
            return JsonResult.error(e.getCode(), e.getMessage());
        } catch (Exception e) {
            log.error("系统异常: ", e);
            return JsonResult.error(StatusCode.UNKNOWN_ERROR.getCode(), "系统异常，请联系管理员");
        }
    }

    /**
     * 处理无返回值业务方法，使用默认成功消息
     */
    public static JsonResult<Void> handleBusiness(Runnable businessLogic) {
        return handleBusiness(businessLogic, "操作成功");
    }
}